package co.edu.uniandes.moviles.rollerjudge.logica;

import java.util.ArrayList;
import java.util.Date;

public class PruebaIndividual {
	
	private Date fechaInicio;
	
	private Date fechaFin;
	
	private ArrayList<Registro> registros;
	
	private ArrayList<Deportista> participantes; 
	
	private ArrayList<Deportista> listaLlegada; 
	
	/**
	 * @return the listaLlegada
	 */
	public ArrayList<Deportista> getListaLlegada() {
		return listaLlegada;
	}

	/**
	 * @param listaLlegada the listaLlegada to set
	 */
	public void setListaLlegada(ArrayList<Deportista> listaLlegada) {
		this.listaLlegada = listaLlegada;
	}

	private String genero;
	
	private int edadMinima;
	
	private int edadMaxima;
	private int distancia;
	
	public PruebaIndividual(ArrayList<Deportista> participantes, String genero, int edadMinima, int edadMaxima, int distancia){
		this.participantes =  participantes;
		this.genero = genero;
		this.edadMinima = edadMinima;
		this.edadMaxima = edadMaxima;
		registros = new ArrayList<Registro>();
		listaLlegada = new ArrayList<Deportista>();
		this.distancia = distancia;
	}
	
	/**
	 * @return the distancia
	 */
	public int getDistancia() {
		return distancia;
	}

	/**
	 * @param distancia the distancia to set
	 */
	public void setDistancia(int distancia) {
		this.distancia = distancia;
	}

	public void iniciarPrueba(){
		fechaInicio = new Date();
	}
	
	public void terminarPrueba(){
		listaLlegada = new ArrayList<Deportista>();
		
		for (int i = 0; i < participantes.size(); i++){
			Deportista patinador = participantes.get(i);
			if(!listaLlegada.contains(patinador)){
				listaLlegada.add(patinador);
			}
			patinador.registrarPrueba(listaLlegada.size()-i, darNumeroFaltasDeportista(patinador), estaDescalificado(patinador));
		}
		fechaFin = new Date();
	}
	
	public int darNumeroFaltasDeportista(Deportista patinador){
		int cuenta = 0;
		for (Registro registro : registros) {
			if(registro.getPatinador()==patinador && registro.getTipo().equals(Registro.FALTA)){
				cuenta++;
			}
		}
		return cuenta;
	}
	
	public void agregarRegistro(Registro pRegistro) throws Exception{
		registros.add(pRegistro);
		Deportista patinador = pRegistro.getPatinador();
		if(pRegistro.getTipo().equals(Registro.FALTA)){
			int faltas = darNumeroFaltasDeportista(patinador);
			if(faltas >= 3){
				Registro descalificacion = new Registro(patinador, patinador.getEquipo(), Registro.DESCALIFICACION, new Date());
				registros.add(descalificacion);
				throw new Exception(descalificacion.getTipo());
			}
		}
		if(pRegistro.getTipo().equals(Registro.LLEGADA)){
			if(!listaLlegada.contains(patinador)){				
				listaLlegada.add(patinador);
				patinador.registrarPrueba(listaLlegada.size(), darNumeroFaltasDeportista(patinador), estaDescalificado(patinador));
				Registro llegada = new Registro(patinador, patinador.getEquipo(), Registro.LLEGADA, new Date());
				registros.add(llegada);
			}
		}
	}
	
	public void cancelarInscripcionParticipante(Deportista patinador){
		participantes.remove(patinador);
	}
	
	public boolean estaDescalificado(Deportista patinador){
		for (Registro registro : registros) {
			if(registro.getPatinador()==patinador && registro.getTipo().equals(Registro.DESCALIFICACION)){
				return true;
			}
		}
		return false;
	}

	public ArrayList<Deportista> getParticipantes() {
		return participantes;
	}

	public Date getFechaInicio() {
		return fechaInicio;
	}

	public Date getFechaFin() {
		return fechaFin;
	}

	public ArrayList<Registro> getRegistros() {
		return registros;
	}
	
	public ArrayList<Deportista> getListaLlegadas() {
		return listaLlegada;
	}
	
	public int getEdadMinima() {
		return edadMinima;
	}

	public int getEdadMaxima() {
		return edadMaxima;
	}
	
	public String getGenero(){
		return genero;
	}
	
	public String resumen()
	{
		String res="";
		for(int i =0;i<registros.size();i++)
		{
			res+=registros.get(i).getPatinador().getNombre() + "-"+registros.get(i).getTipo() + "-"+ registros.get(i).getFecha()+"\n" ;
		}
		return res;
	}
}
